const fs = require('fs/promises');

// 读取信息
  async function readData() {
    let fileHandler;
    try {
      fileHandler = await fs.open('./data/data.txt','r');
      const dataInfo = await fs.readFile(fileHandler,'utf-8');
      // console.log(dataInfo)
      return dataInfo;
    } catch (error) {
      console.log('@@@@@', error);
    } finally {
      fileHandler?.close();
    }
  }

  // 修改信息
  async function upData(data) {
    let flags = true;
    try {
<<<<<<< HEAD
      fs.writeFile('../data/data.txt',data,{flag : "w"});
=======
      fs.writeFile('./data/data.txt',data,{flag : "w"});
>>>>>>> d24fc0dda3c8596c3ee506b8faff562b7c38ef03
      return  flags
    } catch (error) {
       flags = false;
      console.log('@@@@@', error);
    } 
  }

  // 筛选信息，主要用于用户管理
  function selectInfos(dataInfo,infos) {
    const userList =[];
    let flag=false;
    dataInfo.accounts.forEach(item => { 
      const userInfo={};
      // 处理数据，可以使用
      item.washPosition =item.resumeInfo.baseInfo.washPosition; 
      item.degree =item.resumeInfo.degreeInfo.degree; 
      item.statas =item.resumeInfo.baseInfo.statas; 
      item.name =item.resumeInfo.baseInfo.name; 
      // 
      let count = 0;
      let infoLength = Object.keys(infos).length
      Object.keys(infos).forEach(ite =>{
        if(infos[ite] !== ""){
          if(infos[ite] === item[ite]){
            count++
          }
        }else {
          infoLength--
        }
      })
      // console.log(item.userinfo.id)

      // 如果条件全部匹配，就将匹配的数据存放在一起,没有条件匹配就全部存放到一起
      if(count === infoLength || infoLength === 0) {
        // console.log(infos)
        flag=true;
        userInfo.id = item.userinfo.id;
        userInfo.avatar = item.userinfo.avatar;
        userInfo.uName = item.userinfo.uName;
        userInfo.age = item.resumeInfo.baseInfo.age;
        userInfo.address = item.resumeInfo.baseInfo.address;
        userInfo.degree = item.resumeInfo.degreeInfo.degree;
        userInfo.washPosition = item.resumeInfo.baseInfo.washPosition;
        userInfo.registerTime = item.userinfo.registerTime;
        userInfo.recentLoginTime = item.userinfo.recentLoginTime;
        userInfo.resume = item.resumeInfo.baseInfo.resume;
        userInfo.statas = item.resumeInfo.baseInfo.statas;
        userInfo.canUse = item.resumeInfo.baseInfo.canUse;
        userInfo.userAllInfo = item;
        userList.push(userInfo);
      }
    })
    return {
      userList,
      flag
    }
  }

  // 筛选信息
  /**
   * @param {Object} dataInfo 读取的信息
   * @param {Object} infos 用户输入信息
   * @param {String} type 在那个范围中筛选信息
  */
  function selectInfo(dataInfo,infos,type) {
    const userList =[];
    let flag=false;
    // 遍历所有数据，有符合条件的数据就将他们统一存放
    dataInfo[type].forEach(item => { 
      const userInfo={};

      // 获取需要的筛选条件
      const filteList = {};
      // 处理数据，可以使用
      Object.keys(item.filterInfo).forEach(fil => {
          filteList[fil] = item.filterInfo[fil]
      })

      // 判断所需要的条件有多少符合
      let count = 0;
      let infoLength = Object.keys(infos).length
      Object.keys(infos).forEach(ite =>{
        if(infos[ite] !== "") {
          if(infos[ite] === filteList[ite]){
            count++
          }
        }else {
          infoLength--
        }
      })

      // 如果条件全部匹配，就将匹配的数据存放在一起,没有条件匹配就全部存放到一起
      if(count === infoLength || infoLength === 0) {
        flag=true;
        userInfo.info = item.info;
        userInfo.userAllInfo = item;
        userList.push(userInfo);
      }
    })
    return {
      userList,
      flag
    }
  }


  // 返回值 接口返回数据  
  function routerReturnValue(ctx,flag,data = {})  {
    if(flag) {
      ctx.body ={
        msg:"succeed",
        data
      }
    }else {
      ctx.body ={
        msg:"fail"
      }
    }
  }

  // 自动添加id
  function addId(info,data,type) {
    let id = 0;
    // 找到最大的id值
    if(!info.id) {
      data[type].forEach(item =>{
        if(id < item.info.id) {
          id = Number(item.info.id);
        }
      })
      // 给新数据添加上一个id值
      info.id = 1 + id 
    }
    return info
  }

  // 修改，新增信息
  /**
   * @param {Object} ctx 上下文
   * @param {Object} infos 用户传入信息
   * @param {Object} dataInfo 读取的数据信息
   * @param {String} type 需要的数据类型
  */
  function addAndUpload(ctx,infos,dataInfo,type) {
    let flag =false;
    // 当count和countif等于0时添加或修改数据
    let countif =0;

    // 储存过滤信息
    let filtInfoArr = [...Object.keys(dataInfo[type][0].filterInfo)];
    const filtInfo = {};
    filtInfoArr.forEach(item => {
      filtInfo[item] = infos[item];
    })


    // 数据处理
    dataInfo[type].forEach(item => {
      
      // 没有id时是添加，有时是修改
      if(item.info.id == infos.id){
        // id相同就修改数据
        item.info = infos;
        // 将过滤条件信息修改
        Object.keys(item.filterInfo).forEach(ite => {
          item.filterInfo[ite] = infos[ite]
        })

        // 保存信息
        upData(JSON.stringify(dataInfo))
            .then((res)=>{
              flag = res;
              routerReturnValue(ctx,flag,item)
            });
      }

      // 添加信息
      if(!dataInfo[type][infos.id] && countif === 0) {
        // 添加信息
        // 如果有输入信息就添加
        if(Object.keys(infos).length > 1) {
          // const filterInfo = {...filtInfo} = {...infos}
          dataInfo[type].push({
            filterInfo:filtInfo,
            info:infos
          })
          countif++;
          // 保存信息
          // console.log(dataInfo.bannerManage)
          upData(JSON.stringify(dataInfo))
              .then((res)=>{
                flag = res;
                routerReturnValue(ctx,flag,item)
              });
        }else {
          // 没有输入信息就获取信息
          // id不存在就添加信息，没有id就获取信息
          // 获取信息
          flag = true;
          routerReturnValue(ctx,flag,dataInfo[type]);
        }
      }

      
    })
  }

  // 根据id删除信息
  function deleteIndoById(ctx,infos = [],dataInfo,type) {
    let flag = false;
    const deletList = [];
    infos.forEach(item => {
      dataInfo[type].forEach(ite => {
        if(ite.info.id == item) {
          const index = dataInfo[type].findIndex((element) => element === ite);
          const deleteInfo = dataInfo[type].splice(index , 1)
          deletList.push(deleteInfo)
        }
      })
    })

    // 将信息添加到data文件中
    upData(JSON.stringify(dataInfo))
    .then((res)=>{
      flag = res;
      routerReturnValue(ctx,flag,deletList)
    });
  }

  
  
module.exports = {
  readData,upData,selectInfos,selectInfo,addId,routerReturnValue,addAndUpload,
  deleteIndoById
};